/*!
 * \file WtUftDtMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT数据管理器定义文件
 * 
 * \details 定义了UFT(Ultra Fast Trading)数据管理器类，负责管理超高频交易环境下的
 *          实时数据和历史数据。该模块提供高性能的数据缓存、数据检索和数据推送功能，
 *          专门优化了高频数据访问的性能需求。
 */
#pragma once
#include <vector>
#include "../Includes/IDataReader.h"
#include "../Includes/IDataManager.h"

#include "../Includes/FasterDefs.h"
#include "../Includes/WTSCollection.hpp"

NS_WTP_BEGIN
class WTSVariant;
class WTSTickData;
class WTSKlineSlice;
class WTSTickSlice;
class IBaseDataMgr;
class IBaseDataMgr;
class WtUftEngine;

/*!
 * \class WtUftDtMgr
 * \brief UFT数据管理器类
 * 
 * \details UFT数据管理器，继承自IDataManager接口，专门为超高频交易环境提供
 *          高性能的数据管理服务。主要功能包括：
 *          - 实时Tick数据缓存和管理
 *          - 历史K线数据的高速检索
 *          - Level2数据（委托队列、委托明细、成交明细）管理
 *          - 数据推送和通知机制
 *          - 多种数据类型的统一访问接口
 *          - 针对UFT场景优化的数据缓存策略
 * 
 * \note 该类针对超高频交易场景进行了特殊优化，确保极低的数据访问延迟
 * \warning 所有数据操作都需要考虑线程安全性
 */
class WtUftDtMgr : public IDataManager
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化UFT数据管理器，创建必要的数据缓存结构
	 */
	WtUftDtMgr();
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理数据管理器资源，释放所有缓存的数据
	 */
	~WtUftDtMgr();

public:
	/*!
	 * \brief 初始化数据管理器
	 * \param cfg 配置参数
	 * \param engine UFT引擎指针
	 * \return bool 初始化是否成功
	 * 
	 * \details 根据配置参数初始化数据管理器，建立与UFT引擎的关联关系，
	 *          设置数据缓存参数和数据源配置
	 */
	bool	init(WTSVariant* cfg, WtUftEngine* engine);

	/*!
	 * \brief 处理推送的行情数据
	 * \param stdCode 标准合约代码
	 * \param newTick 新的Tick数据
	 * 
	 * \details 接收并处理从行情源推送的实时Tick数据，更新实时数据缓存，
	 *          触发相关的数据通知事件。这是数据管理器的核心入口方法。
	 */
	void	handle_push_quote(const char* stdCode, WTSTickData* newTick);

	//////////////////////////////////////////////////////////////////////////
	// IDataManager 接口实现
	
	/*!
	 * \brief 获取Tick数据切片
	 * \param stdCode 标准合约代码
	 * \param count 获取数据数量
	 * \param etime 结束时间，0表示最新时间
	 * \return WTSTickSlice* Tick数据切片指针
	 * 
	 * \details 从缓存或数据源获取指定数量的历史Tick数据，
	 *          数据按时间倒序排列（最新的在前）
	 */
	virtual WTSTickSlice* get_tick_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取委托队列数据切片
	 * \param stdCode 标准合约代码
	 * \param count 获取数据数量
	 * \param etime 结束时间，0表示最新时间
	 * \return WTSOrdQueSlice* 委托队列数据切片指针
	 * 
	 * \details 获取Level2委托队列数据，提供订单簿深度信息
	 */
	virtual WTSOrdQueSlice* get_order_queue_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取委托明细数据切片
	 * \param stdCode 标准合约代码
	 * \param count 获取数据数量
	 * \param etime 结束时间，0表示最新时间
	 * \return WTSOrdDtlSlice* 委托明细数据切片指针
	 * 
	 * \details 获取Level2委托明细数据，提供单笔委托的详细信息
	 */
	virtual WTSOrdDtlSlice* get_order_detail_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取成交明细数据切片
	 * \param stdCode 标准合约代码
	 * \param count 获取数据数量
	 * \param etime 结束时间，0表示最新时间
	 * \return WTSTransSlice* 成交明细数据切片指针
	 * 
	 * \details 获取Level2成交明细数据，提供逐笔成交信息
	 */
	virtual WTSTransSlice* get_transaction_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取K线数据切片
	 * \param stdCode 标准合约代码
	 * \param period K线周期类型
	 * \param times 周期倍数
	 * \param count 获取K线数量
	 * \param etime 结束时间，0表示最新时间
	 * \return WTSKlineSlice* K线数据切片指针
	 * 
	 * \details 获取指定周期和数量的K线数据，支持多种周期类型（分钟、小时、日等）
	 */
	virtual WTSKlineSlice* get_kline_slice(const char* stdCode, WTSKlinePeriod period, uint32_t times, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取最新Tick数据
	 * \param stdCode 标准合约代码
	 * \return WTSTickData* 最新Tick数据指针
	 * 
	 * \details 获取指定合约的最新Tick数据，数据来自实时缓存
	 */
	virtual WTSTickData* grab_last_tick(const char* stdCode) override;

private:
	WtUftEngine*		_engine;		///< UFT引擎指针，用于回调和通信

	faster_hashset<std::string> _subed_basic_bars;		///< 已订阅的基础K线代码集合
	
	typedef WTSHashMap<std::string> DataCacheMap;		///< 数据缓存映射表类型定义
	DataCacheMap*	_bars_cache;		///< K线数据缓存，键为合约代码+周期，值为K线数据
	DataCacheMap*	_ticks_cache;		///< 历史Tick数据缓存，键为合约代码，值为Tick数据列表
	DataCacheMap*	_rt_tick_map;		///< 实时Tick数据映射，键为合约代码，值为最新Tick数据

	/*!
	 * \struct _NotifyItem
	 * \brief K线通知项结构体
	 * 
	 * \details 用于K线数据更新通知的结构体，包含合约代码、周期信息和新K线数据
	 */
	typedef struct _NotifyItem
	{
		std::string _code;			///< 合约代码
		std::string _period;		///< K线周期字符串
		uint32_t	_times;			///< 周期倍数
		WTSBarStruct* _newBar;		///< 新K线数据指针
	} NotifyItem;

	std::vector<NotifyItem> _bar_notifies;	///< K线通知队列，用于批量处理K线更新通知
};

NS_WTP_END